//package com.cx.ucenter.ctrl.rabbitmq;
//
//import com.cx.common.constant.MqConstant;
//import com.rabbitmq.client.Channel;
//import lombok.extern.slf4j.Slf4j;
//import org.springframework.amqp.core.Message;
//import org.springframework.amqp.rabbit.annotation.RabbitListener;
//import org.springframework.stereotype.Component;
//
//import java.io.IOException;
//import java.util.concurrent.TimeUnit;
//
///**
// * @Author:chenxiaoyi
// * @Date:2020/8/8 15:27
// */
//@Slf4j
//@Component
//public class Consumer {
//
//    //******************************直连交换机 start**********************************************
//    /**
//     *  C1.监听消费object
//     */
//    @RabbitListener(queues = MqConstant.Queue.D_QUEUE_B)
//    public void cunsomerDirect0(Object object,  Channel channel,Message message) throws IOException {
//        try {
//            System.out.println(MqConstant.Queue.D_QUEUE_B+object.toString());
////            int i = 1/0;
//            channel.basicAck(message.getMessageProperties().getDeliveryTag(),false);
//        }catch (Exception e){
//            log.error("消费失败 继续由当前消费者消费");
////            拒绝签收 参数:1 true 回到队列 继续且只能让你消费。false 回到队列 继续被任意消费
//            channel.basicRecover(true);
//        }
//
//    }
//
//    /**
//     *  C2.消费work模式 -- 多个消费者监听队列消息
//     *      1.mq默认轮询消费机制,保证每个消费者均等消费消息
//     *      2.如果其中一个消费者耗时过长则出现队列阻塞问题
//     *          开启能者多劳模式---配置ack手动签收
//     */
//    @RabbitListener(queues = MqConstant.Queue.D_QUEUE_A)
//    public void cunsomerDirect1(String string,Channel channel,Message message) throws IOException {
//        long deliveryTag = message.getMessageProperties().getDeliveryTag();
//        try {
//            /** 处理业务逻辑 */
//            log.info("第一个睡两秒:--"+MqConstant.Queue.D_QUEUE_A+"--"+string);
//            TimeUnit.SECONDS.sleep(2);
//
//            //确认签收 参数1:当前消息在队列中的索引 参数2:true:批量确认收到的消息(如一次收到三条消息来消费{prefetch:3})。false:只确认当前这一条
//            channel.basicAck(deliveryTag,false);
//        } catch (Exception e) {
//            //拒绝签收  参数3: true:则消息重新返回队列,等待重新发送给消费者。false:将消息丢弃
//            channel.basicNack(deliveryTag,false,true);
//            e.printStackTrace();
//        }
//
//    }
//
//    @RabbitListener(queues = MqConstant.Queue.D_QUEUE_A)
//    public void cunsomerDirect2(String string,Channel channel,Message message) throws IOException {
//        try {
//            /** 处理业务逻辑 */
//            log.info("第二个:--"+MqConstant.Queue.D_QUEUE_A+"--"+string);
//
//            //确认签收 参数1:当前消息在队列中的索引 参数2:true:批量确认收到的消息(如一次收到三条消息来消费{prefetch:3})。false:只确认当前这一条
//            channel.basicAck(message.getMessageProperties().getDeliveryTag(),false);
//        } catch (Exception e) {
//            //拒绝签收  参数3: true:则消息重新返回队列,等待重新发送给消费者。false:将消息丢弃
//            channel.basicNack(message.getMessageProperties().getDeliveryTag(),false,true);
//            e.printStackTrace();
//        }
//    }
//
//
//    //******************************直连交换机  end**********************************************
//
//
//    //******************************广播交换机  start*********************************************
//
//    /**
//     * C4.只要监听广播的队列都会消费消息
//     */
//    @RabbitListener(queues = MqConstant.Queue.F_QUEUE_A)
//    public void consumeFanout0(String msg,Channel channel,Message message) throws IOException {
//        System.out.println("第一个广播消费者:-"+msg);
////        channel.basicAck(message.getMessageProperties().getDeliveryTag(),false);
//    }
//
//    @RabbitListener(queues = MqConstant.Queue.F_QUEUE_B)
//    public void consumeFanout1(String msg,Channel channel,Message message) throws IOException {
//        System.out.println("第二个广播消费者:-"+msg);
////        channel.basicAck(message.getMessageProperties().getDeliveryTag(),false);
//    }
//
//
//    //******************************广播交换机  end*********************************************
//
//
//
//
//}
